<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

date_default_timezone_set('Asia/Shanghai');
header("Cache-control:no-cache,no-store,must-revalidate");
header("Pragma:no-cache");
header("Expires:0");
/**
 * 自己的核心控制器类，继承CI的核心控制器
 * @author wwj
 *
 */
class MY_Controller extends CI_Controller
{
	/**
	 * 管理员登录名称
	 * @var string
	 */
	public $loginname = '';
	
	/**
	 * 管理员权限值
	 * @var int
	 */
	private $__purview = 0;
	
	/**
	 * 后台页面头部<head>部分，包含基本和常用的css,js文件引入
	 * @var string
	 */
	public $header = '';
	
	/**
	 * 表单要验证的数组
	 * @var array
	 */
	public $validate_data = array();
	
	/**
	 * 超级管理员ID
	 * @var int
	 */
	const ADMIN_ID = 1;
	
	function __construct()
	{
		parent::__construct();

		// 加载js，css整合文件
		$this->header = $this->load->view('header_inc', '', TRUE);
		
		
		// @TODO 获取来源地址，用于用户过期后，再次登录，可重定向到失效前的地址
		
	}
	
	/**
	 * 检查管理员登录状态
	 * @return string|boolean
	 */
	protected function check_login()
	{
		$uid           = $this->session->userdata('uid');
		$shell         = $this->session->userdata('shell');
		$logintime     = $this->session->userdata('logintime');
		if (!empty($uid) && !empty($shell) && !empty($logintime))
		{
			// 管理员登录时间限制
			if (time() - $logintime > LOGIN_TIME)
			{
				$this->logout($this->lang->line('error_login_timeout'));
				return FALSE;
			}
			$manager = $this->manager_m->get_manager(array('id' => $uid));
			
			if (is_array($manager) && !empty($manager))
			{
				$shell_check = strtolower(md5($manager['id'].$manager['password'].SECRET_KEY));
	
				// 判断管理员是否被锁定
				if (1 == intval($manager['islocked']))
				{
					$this->logout($this->lang->line('error_admin_locked'));
					return FALSE;
				}
	
				if ($shell == $shell_check)
				{
					$this->session->set_userdata('logintime', time());
					$this->loginname = $manager['loginname'];
					$this->__purview = (int)$manager['purview'];
					return TRUE;
				}
				else
				{
					$this->logout($this->lang->line('error_invalid_session'));
					return FALSE;
				}
			}
			else
			{
				$this->logout($this->lang->line('error_invalid_admin'));
				return FALSE;
			}
				
		}
		else
		{
			$buffer = $this->load->view('login', array('header' => $this->header), TRUE);
			echo $buffer;
			exit;
		}
	}
	
	/**
	 * 验证管理员权限
	 * @param int $purview
	 */
	protected function verify_purview($purview)
	{
		// 超级管理员不做限制
		if ($this->session->userdata('uid') > self::ADMIN_ID && !($purview & $this->__purview))
		{
			$this->_show_message(base_url('main/right'), $this->lang->line('msg_operation_deny'), 'goback');
			return ;
		}
	}

	/**
	 * 管理员退出登录状态
	 * @param string $message 退出提示信息
	 * @return boolean
	 */
	public function logout($message = 'Error,System will logout.')
	{
		$this->clear_admin_session();
		$this->_show_message(base_url('login'), $message);
		return TRUE;
	}
	
	/**
	 * 清除管理员session
	 */
	protected function clear_admin_session()
	{
		$admin_session = array(
				'uid'=>'',
				'shell'=>'',
				'logintime'=>''
		);
		$this->session->set_userdata($admin_session);
	}
	
	/**
	 * 获取来源地址
	 * @param string $pref 在地址前要添加的组合字符串
	 * @return string
	 */
	protected function get_referer_url($pref = '?')
	{
		$this->load->library('user_agent');
		
		return $pref . 'redirect=' . urlencode($this->agent->referrer());
	}
	
	/**
	 * 显示跳转页面信息
	 * @param string $redirect_url 要跳转的页面地址
	 * @param string $message 显示的提示信息
	 * @param string $redirect_type 跳转类型
	 */
	protected function _show_message($redirect_url, $message, $redirect_type = 'jump')
	{
		$msg 	= message($redirect_url, $message, $redirect_type);
		$buffer = $this->load->view('message', $msg, TRUE);
		echo $buffer;
		exit;
	}
	
	/**
	 * 将栏目分类重新组合为数组，子类放到sub元素下面
	 * @param int $fatherid 父类id，取得栏目分类的开始节点
	 * @param int $escape_id 要跳过的栏目id，此分类及其子类都会跳过，
	 * @return array
	 */
	public function get_column_as_array($fatherid = 0, $escape_id = '')
	{
		$this->load->model('column_m');
		$column = array();
		$_temp = array();
		$cid = 'id';
		$pid = 'fatherid';
		$child = 'sub';
		
		$where = array('id >' => (int)$fatherid);
		$data = $this->column_m->get_column();
		
		// 采用类似链表指针的方式组建分类树
		foreach($data as $key => $val)
		{
			$_temp[$val[$cid]] = & $data[$key];
		}
		
		foreach($data as $key => $val)
		{
			// 跳过指定的分类id，用于在select列表中显示，防止将分类转移到其子类当中
			if($val['id'] == $escape_id && $escape_id != 0)
			{
				continue;
			}
			
			$parentId = $val[$pid]; // 上级id
			if($fatherid == $parentId)
			{ // 如果上级id 等于根id
				$column[] = & $data[$key]; // 那么 添加到tree里面
			}
			else
			{
				if(isset($_temp[$parentId]))
				{
// 					$parent = & $_temp[$parentId];
// 					$parent[$child][] = & $data[$key];
					$_temp[$parentId][$child][] = & $data[$key];
				}
			}
		}
		return $column;
	}
	
	/**
	 * 判断栏目下是否有子类,没有子类返回真，有子类返回假
	 * @param int $id
	 * @return boolean
	 */
	protected function has_sub_column($id)
	{
		$this->load->model('column_m');
		$sub_column = $this->column_m->get_sub_column_count((int)$id);
		return 0 === $sub_column;
	}
	
	/**
	 * ajax方式设置文章的状态，全局通用
	 * @param string $model 要调用的模型
	 * @param string $table 要操作的表
	 * @return string 返回json结果
	 */
	protected function config_state($model, $table)
	{
		$result = array('error' => FALSE, 'message' => $this->lang->line('msg_operation_success'));
		if (!$this->state_config_validate())
		{
			$result['error'] = TRUE;
			$result['message'] = validation_errors();
			return json_encode($result);
		}
	
		$state = $this->input->post();
		if (isset($state['id']) && !empty($state['id']))
		{
			$id['id'] = $state['id'];
			unset($state['id']);
				
			// 更新状态
			$this->$model->update($table, $id, $state);
			return json_encode($result);
		}
		else
		{
			$result['error'] = TRUE;
			$result['message'] = $this->lang->line('error_invalid_post');
			return json_encode($result);
		}
	}
	
	/**
	 * 通用状态验证方法
	 */
	protected function state_config_validate()
	{
		$this->load->library('form_validation');
		$this->form_validation->set_rules('isverify', 'lang:com_list_verify', 'trim|required|is_natural');
		$this->form_validation->set_rules('isactive', 'lang:com_list_active', 'trim|required|is_natural');
		$this->form_validation->set_rules('istop', 'lang:com_list_top', 'trim|required|is_natural');
		$this->form_validation->set_rules('isrecommend', 'lang:com_list_recommend', 'trim|required|is_natural');
		
		// @FIXME 保留功能，验证是否是热点
		//$this->form_validation->set_rules('ishot', 'lang:com_list_hot', 'trim|required|is_natural');
		
		return $this->form_validation->run();
	}
	
	/**
	 * 获取分页信息
	 * @param array $config 分页类初始化数组
	 * @return array
	 */
	protected function get_page($config)
	{
		$this->pagination->initialize($config);
		$data['page'] 		= $this->pagination->create_links();
		$data['limit'] 		= $this->pagination->get_limit_data();
		$data['per_page'] 	= $this->pagination->per_page;
		return $data;
	}
	
	/**
	 * 获取上传文件的网址访问地址
	 * @param string $path
	 */
	protected function get_uploadfile_path($path)
	{
		$this->config->load('upload');
		return base_url('../' . $this->config->item('upload_path').$path);
	}
	
	/**
	 * 验证表单，成功返回TRUE，否则返回错误信息
	 * @param array $data 数组格式
	 * @return boolean|string
	 */
	protected function validation($data)
	{
		$this->load->library('form_validation');
		$this->form_validation->set_rules($data);
		if ($this->form_validation->run())
		{
			return TRUE;
		}
		else 
		{
			return validation_errors();
		}
	}
	
	/**
	 * 处理AJAX返回信息，将数组转化为json格式
	 * @param boolean $error 是否有错误信息
	 * @param string $message 错误信息内容
	 * @return string
	 */
	protected function array2json($error = FALSE, $message = '')
	{
		return json_encode(array('error' => $error, 'message' => $message));
	}
}